// week_connect_deal.go 一周内下线的机器的重新扫描，尝试将最近下线机器拉起
package agent

import (
    "time"
    "cloud_worm/util/uweb/ucron"
)

// @Description: 分析一周上下线情况的逻辑处理
type WeekDisConnectDealJob struct {
    Name            string
}

//@Description：分析的逻辑处理
//@Param:
//@Return：
func (w WeekDisConnectDealJob) Run()  {
    //recordID, err := crontask.CronJobBegin(w)
    //var msgs []string
    //if err != nil {
    //    msgs = append(msgs, err.Error())
    //}
	//
    //// 计算起止时间
    //dayDura, _ := time.ParseDuration("-24h")
    //startTime := time.Now().Add(7 * dayDura)
    //endTime := time.Now()
	//
    //// 结果
    //scanRet := WeekOfflineData{
    //    StartTime: startTime.Format(uconst.TimeFormat),
    //    EndTime: endTime.Format(uconst.TimeFormat),
    //}
	//
    //// select出所有本周下线机的对象
    //var connData []*dbmanager.WormId
    //worm := &dbmanager.WormId{}
    //offset := mysqldb.SelectOffsetZero
    //for {
    //    conns, err := worm.Select(offset, mysqldb.ScanLimitValue, dbmanager.AgentOffline,
    //        mysqldb.SelectIntAll, mysqldb.SelectStrAll, mysqldb.SelectStrAll, mysqldb.SelectStrAll, mysqldb.SelectStrAll,
    //            int(startTime.Unix()), int(endTime.Unix()), ctrutil.RunMode)
    //    if err != nil {
    //        errMsg := fmt.Sprintf("Select offline error: %s", err.Error())
    //        scanRet.ErrorInfo = errMsg
    //        msgs = append(msgs, errMsg)
    //        logs.Error(fmt.Sprintf("'%s' error: %s", reflect.TypeOf(w).Name(), errMsg))
    //        break
    //    }
    //    if len(conns) <= 0 {
    //        msg := fmt.Sprintf("`%s` select empty", reflect.TypeOf(w).Name())
    //        msgs = append(msgs, msg)
    //        logs.Info(msg)
    //        break
    //    }
    //    connData = append(connData, conns...)
	//
    //    offset = offset + mysqldb.ScanOffsetValue
    //}
	//
    //// 遍历处理
    //for _, item := range connData {
    //    o := OfflineMachine{IP: item.IP}
    //    // 设备状态
    //    devStatus, err := ctrutil.GetDevStatusFromMiLan(item.Ip)
    //    if err != nil {
    //        msg := fmt.Sprintf("query dev status failed: %s", err.Error())
    //        msgs = append(msgs, msg)
    //        logs.Error(msg)
    //        o.ErrorInfo = err.Error()
    //    }
    //    o.DevStatus = devStatus
	//
    //    // 尝试ping一下看看
    //    args := urpc.OnePingArgs{IP: item.Ip}
    //    reply := urpc.OnePingReply{}
    //    rpcAddr, _ := ctrutil.GetRpcIDForWolserver(item.ServerAddr)
    //    err = ctrutil.WolServerRpc.Call(rpcAddr, "StatusAbout.DoOnePing", &args, &reply)
    //    if err != nil {
    //        o.ErrorInfo = err.Error()
    //    } else {
    //        o.Ping = reply.Ok
    //    }
	//
    //    // 尝试拉起
    //    if o.Ping == true {
    //        err = ctrutil.WuKongInstallWolAgent(item.Ip, strconv.Itoa(item.Version))
    //        if err != nil {
    //            // 推送wukong失败
    //            o.TryOn = err.Error()
    //        }
    //    }
	//
    //    scanRet.OfflineList = append(scanRet.OfflineList, &o)
    //    scanRet.OfflineCnt += 1
    //}
	//
    //// 遍历检查是否上线成功
    //time.Sleep(7 * time.Second)
    //for _, item := range scanRet.OfflineList {
    //    worm := dbmanager.WormId{}
    //    worm.SelectValidByIP(item.IP)
    //    if worm.Status == dbmanager.AgentOffline {
    //        item.TryOn = "上线失败"
    //    } else {
    //        item.TryOn = "上线成功"
    //    }
    //    item.TimeStamp = time.Now()
    //}

    // 将报告发送出来
    // TODO: XXXXXX

    //crontask.CronJobEnd(recordID, w, strings.Join(msgs, ";"))
    return
}


type WeekOfflineData struct {
    ErrorInfo         string            `json:"error_info"`
    StartTime         string            `json:"start_time"`
    EndTime           string            `json:"end_time"`
    
    OfflineCnt        int               `json:"offline_cnt"`        // 下线的总计数
    OfflineList       []*OfflineMachine  `json:"offline_list"`
}

type OfflineMachine struct {
    IP              string              `json:"ip"`
    ErrorInfo       string              `json:"error_info"`
    DevStatus       string              `json:"dev_status"`
    Ping            bool                `json:"ping"`
    TryOn           string              `json:"try_on"`
    TimeStamp       time.Time           `json:"time_stamp"`
}

func init()  {
    ucron.RegisterCronJob(&WeekDisConnectDealJob{Name: "weak_connect_deal"})
}
